# 编译选项
CXX = g++
CXXFLAGS = -Iinclude -I/usr/include/eigen3 -std=c++17
LDFLAGS = -lblas -llapack

# Python选项
PY = python3

# C++源文件及目标
SRC = src/main.cpp src/PoissonSolver.cpp src/Grid.cpp src/BoundaryConditions.cpp
OBJ = $(SRC:.cpp=.o)
EXEC = poisson_solver

# 找到所有的TeX源文件，位于 doc 目录下
OBJ_TEX = $(wildcard doc/*.tex)
# 所有TeX文件名
NAME_TEX = $(OBJ_TEX:doc/%.tex=%.tex)

# 找到所有的Python源文件，位于 src 目录下
SRC_PY = $(wildcard src/*.py)
# 目标是运行Python脚本
TARGETS_PY = $(SRC_PY)

# 默认目标
all: run doc

# 生成目标可执行文件
$(EXEC): $(OBJ)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

# 编译每个 .cpp 文件为 .o 文件
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 执行目标
run: $(EXEC) $(SRC_PY)
	./$(EXEC)
	$(PY) $(SRC_PY)

# 处理文档生成
doc: $(OBJ_TEX)
	@cd doc; \
	for texname in $(NAME_TEX); do \
		echo "Processing $$texname..."; \
		xelatex $$texname; \
		bibtex $(basename $$texname .tex).aux; \
		xelatex $$texname; \
		xelatex $$texname; \
	done

# 清理生成的文件
clean:
	rm -f $(OBJ) $(EXEC)
	# 清理 doc 目录生成的文件
	cd doc && rm -f *.aux *.bbl *.blg *.log *.run.xml *.out *.synctex.gz *.csv main.bbl main-blx.bib
	# 清理构建目录
	rm -rf src/build
